home *** CD-ROM | disk | FTP | other *** search
/ TOS Silver 2000 / TOS Silver 2000.iso / programm / MM2_DEV / S / MOS / CONVERT.I < prev    next >
Encoding:
Text File  |  1994-02-15  |  59.4 KB  |  3 lines

  1. ⓪ IMPLEMENTATION MODULE Convert; (* V#130 *)⓪ (*$Y+,R-,C-,X+,H+ *)⓪ (*$M-  muß global sein, weil sonst dummy-Verkettungen zw. den Tables bleiben *)⓪ (*$J-  ist nötig für ConvReal! *)⓪ ⓪ (* !!! Noch zu implementieren: Wenn bei Get-Routinen DEL-Zeichen⓪'geholt wird, dies richtig auswerten.⓪ ⓪#14.06.87  jm  Atari-Realformat eingeführt⓪#18.06.87  jm  in ConvFix & ConvEng hoffentlich ordentliche Rundung.⓪1Jetzt Ausgabe von max. 14 signifikanten Stellen;⓪1dazu RoundKonst-Tabelle um einen Eintrag erweitert.⓪#19.06.87  jm  ConvLInt & ConvLCard raus⓪#22.06.87  TT  Neben SPACE wird auch TAB am Anfang überlesen⓪#08.07.87  TT  TRAP-Nummern korrigiert; 'ten' liefert valid-Wert statt TRAP⓪1auszulösen; Reg D3-D7 überall gerettet;⓪1Scanning erreicht immer Aufrufer.⓪#27.10.87  jm  Rundung in ConvFix, ConvEng nochmals korrigiert⓪#01.03.88  TT  ConvFix, ConvEng: ten-Aufruf: valid-Argument fehlte,⓪3führte zu Addreß/Buserrors.⓪#01.04.88  TT  ConvReal entscheidet nun richtig zw. Float/Fix.⓪ ⓪#20.06.88  ubu Convert-procs f. 68020/881 eingebaut.⓪#26.08.88  MR  Convert-procs f. 68881-solo.⓪ ⓪#10.09.88  TT  ConvToLNum, ConvToNum bei allen Basen korrekt.⓪#17.09.88  TT  ConvToLNum bei Zahlen > 16 Bit korrekt⓪#16.04.89  TT  ConvFix/Eng runden richtig (roundKonst -> half)⓪#12.06.89  TT  Kein String-Overflow bei WriteFix & optimiertem Linken⓪#15.06.89  TT  Include-File f. Prozessoren⓪#16.06.89  TT  ConvToReal f. A68881 rief Buserror bei neg. Mantisse hervor,⓪3weil ein '#' fehlte (es war da ein Space - ein Datenfehler?)⓪1Für FPU Error-Behandlung überarbeitet.⓪#17.06.89  TT  ConvFloat/Fix/Eng von GS übernommen - CFloat aber noch nicht,⓪3weil da erst Anpassung der A68881-Routinen nötig ist!⓪#18.08.89  TT  fillchar-Parameter bei ConvNum⓪#06.03.90  TT  Rundung bei ConvFix/ConvEng korrigiert: Bei max. Mantisse wird⓪314 statt 13 nach D0 geladen⓪#30.05.90  TT  ConvFix/Eng lösen bei FPU-Benutzung keinen Fehler bei 0.0 aus⓪#04.07.90  TT  alte Runtime-Aufrufe raus⓪#17.10.90  TT  ST-FPU: ConvToReal setzt bei Error die FPU zurück und räumt⓪1Stack korrekt ab.⓪#24.10.90  TT  $H+ implementiert⓪#19.02.91  TT  Ein paar mehr Warteschleifen für ST-FPU; keine Laufzeitfehler⓪1mehr bei TT-FPU (nicht getestet).⓪#25.03.91  TT  ConvToNum/ConvToLNum wieder korrekt bei Werten > 256.⓪#28.02.91  TT  Laufzeitfehler bei TT-FPU getestet/korrigiert.⓪#08.02.94  TT  Kein Byte-Zugriff mehr auf fpstat+1 wg. STE.⓪#15.02.94  TT  Warteschleife bei 'movl3' hinzugefügt.⓪ *)⓪ ⓪ FROM SYSTEM IMPORT CompilerVersion, ASSEMBLER, LONGWORD, WORD, ADDRESS;⓪ FROM MOSConfig IMPORT RadixChar, FixToFloatMin, FixToFloatMax;⓪ FROM MOSGlobals IMPORT StringOverflow, Overflow, OutOfRange;⓪ FROM SFP004 IMPORT FPUReset, FPUError;⓪ ⓪ (*$I FPU.CNF *)⓪ ⓪ (*$? A68881:⓪ CONST⓪(fpstat  =  $fffa40;       (* Response word of MC68881 read *)⓪(fpctrl  =  $fffa42;       (* Control  word of MC68881 write *)⓪(fpcmd   =  $fffa4a;       (* Command  word of MC68881 write *)⓪(fpcond  =  $fffa4e;       (* Condition word of MC68881 write *)⓪(fpop    =  $fffa50;       (* Operand  long of MC68881 read/write *)⓪ *)⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE @RMUL;⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L  #8,A3⓪(MOVE.L  A3,A0⓪(LEA     -8(A3),A1⓪(JMP     @LMUL⓪$END⓪"END @RMUL;⓪ ⓪ (*$L-*)⓪ PROCEDURE @RADD;⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L  #8,A3⓪(MOVE.L  A3,A0⓪(LEA     -8(A3),A1⓪(JMP     @LADD⓪$END⓪"END @RADD;⓪ ⓪ (*$L-*)⓪ PROCEDURE @RDIV;⓪"BEGIN⓪$ASSEMBLER⓪(SUBQ.L  #8,A3⓪(MOVE.L  A3,A0⓪(LEA     -8(A3),A1⓪(JMP     @LDIV⓪$END⓪"END @RDIV;⓪ ⓪ ⓪ TYPE LStr = RECORD⓪-p:POINTER TO ARRAY [0..0] OF CHAR;⓪-h:Cardinal;⓪-l:Cardinal;⓪+END;⓪ ⓪ (*$L-*)⓪ PROCEDURE getch;⓪ BEGIN⓪ ASSEMBLER⓪(MOVEM.L D0/D2/A0/A1/A2,-(A7)⓪(MOVE.L  A2,(A3)+        ; ^ GetInfo⓪(MOVE.L  (A0)+,A1⓪(MOVE.L  (A0),D2⓪(JSR     (A1)⓪(MOVEM.L (A7)+,D0/D2/A0/A1/A2⓪(MOVEQ   #0,D1⓪(MOVE.B  GetInfo.ch(A2),D1⓪(CMPI.B  #$5F,D1⓪(BLE     getch1⓪(BCLR    #5,D1⓪ !getch1⓪ END⓪ END getch;⓪ ⓪ (*$L-*)⓪ PROCEDURE StrToLC;⓪ BEGIN⓪ ASSEMBLER⓪(CMPI   #'+',D1⓪(BNE    noplus⓪(JSR    getch⓪ !noplus CMPI   #'%',D1⓪(BEQ    bin⓪(CMPI   #'$',D1⓪(BNE.L  dez⓪(BRA    hex⓪ ⓪ finis2  BRA.L  finis⓪ ⓪ !hex    JSR    getch⓪(SUBI.B #'0',D1⓪(BCS    finis2⓪(CMPI.B #9,D1⓪(BLS    hex1⓪(SUBQ.B #7,D1⓪(CMPI.B #$A,D1⓪(BCS    finis2⓪(CMPI.B #$F,D1⓪(BHI    finis2⓪ !hex1   MOVE   D1,D0⓪(MOVEQ  #1,D2⓪ hex2    JSR    getch⓪(SUBI.B #'0',D1⓪(BCS    finis2⓪(CMPI.B #9,D1⓪(BLS    hex3⓪(SUBQ.B #7,D1⓪(CMPI.B #$A,D1⓪(BCS    finis2⓪(CMPI.B #$F,D1⓪(BHI    finis2⓪ !hex3   ROL.L  #4,D0⓪(MOVE.B D0,D5⓪(ANDI   #$F,D5⓪(BNE    hex4⓪ hex5    OR.B   D1,D0⓪(BRA    hex2⓪ hex4    MOVEQ  #0,D2⓪(ANDI.B #$F0,D0⓪(BRA    hex5⓪ ⓪ !bin    JSR    getch⓪(SUBI.B #'0',D1⓪(BCS    finis⓪(CMPI.B #1,D1⓪(BHI    finis2⓪(MOVE.B D1,D0⓪(MOVEQ  #1,D2⓪ !bin2   JSR    getch⓪(SUBI.B #'0',D1⓪(BCS    finis2⓪(CMPI.B #1,D1⓪(BHI    finis2⓪(ASL.L  #1,D0⓪(BCC    bin3⓪(MOVEQ  #0,D2    ; overflow⓪ bin3    OR.B   D1,D0⓪(BRA    bin2⓪(⓪ !dez    SUBI.B #'0',D1⓪(BCS    finis⓪(CMPI.B #9,D1⓪(BHI    finis⓪(MOVE   D1,D0⓪(MOVE   #1,D2⓪(JSR    getch⓪ dez2    SUBI.B #'0',D1⓪(BCS    finis⓪(CMPI.B #9,D1⓪(BHI    finis⓪(MOVE.L D0,D5⓪(LSL.L  #1,D5⓪(BCS    dez3⓪(LSL.L  #1,D5⓪(BCS    dez3⓪(ADD.L  D5,D0⓪(BCS    dez3⓪(LSL.L  #1,D0⓪(BCS    dez3⓪(ADD.L  D1,D0⓪ dez4    JSR    getch⓪(BRA    dez2⓪ dez3    MOVEQ  #0,D2⓪(BRA    dez4⓪ finis⓪ END⓪ END StrToLC;⓪ ⓪ (*$L-*)⓪ PROCEDURE skip; (* Überliest Spaces und TABs *)⓪"BEGIN⓪$ASSEMBLER⓪%l: JSR    getch⓪(CMPI   #' ',D1⓪(BEQ    l⓪(CMPI   #9,D1    ; TAB⓪(BEQ    l⓪$END⓪"END skip;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvToLCard(    get   : GetProc;⓪6VAR info  : GetInfo;⓪6VAR valid : BOOLEAN ): LONGCARD;⓪ BEGIN⓪ ASSEMBLER⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE.L -(A3),A1⓪(MOVE.L -(A3),A2⓪(LEA    -8(A3),A0⓪(MOVEQ  #0,D0⓪(MOVEQ  #0,D2⓪(JSR    skip⓪(JSR    StrToLC⓪(MOVE   D2,(A1)  ; valid⓪(SUBQ.L #8,A3⓪(MOVE.L D0,(A3)+⓪(MOVEM.L (A7)+,D3-D6⓪ END⓪ END ConvToLCard;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvToCard(    get   : GetProc;⓪4VAR info  : GetInfo;⓪4VAR valid : BOOLEAN ): CARDINAL;⓪ BEGIN⓪ ASSEMBLER⓪(JSR    ConvToLCard⓪(MOVE   -(A3),D0⓪(TST    -(A3)⓪(BEQ    finis⓪(CLR    (A1)     ; valid⓪ !finis  MOVE   D0,(A3)+⓪ END⓪ END ConvToCard;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvToLInt(    get   : GetProc;⓪4VAR info  : GetInfo;⓪4VAR valid : BOOLEAN ): LONGINT;⓪ BEGIN⓪ ASSEMBLER⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE.L -(A3),A1⓪(MOVE.L -(A3),A2⓪(LEA    -8(A3),A0⓪(MOVEQ  #0,D0       ;Ergebnis⓪(MOVEQ  #0,D2       ;Valid⓪(JSR    skip⓪(CMPI   #'-',D1⓪(SEQ    D6⓪(BNE    nosign⓪(JSR    getch⓪ !nosign JSR    StrToLC⓪(TST.B  D6⓪(BEQ    finis1⓪(NEG.L  D0⓪ !finis1 MOVE   D2,(A1)  ; valid⓪(SUBQ.L #8,A3⓪(MOVE.L D0,(A3)+⓪(MOVEM.L (A7)+,D3-D6⓪ END⓪ END ConvToLInt;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvToInt(     get   : GetProc;⓪4VAR info  : GetInfo;⓪4VAR valid : BOOLEAN ): INTEGER;⓪ BEGIN⓪ ASSEMBLER⓪(JSR    ConvToLInt⓪(MOVE   -2(A3),D0⓪(EXT.L  D0⓪(MOVE.L -(A3),D1⓪(CMP.L  D0,D1⓪(BEQ    finis⓪(CLR    (A1)     ; valid⓪ !finis  MOVE   D0,(A3)+⓪ END⓪ END ConvToInt;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvLN;⓪ BEGIN⓪ ASSEMBLER⓪ hex     SUBI.B  #'0',D1⓪(BCS     finis⓪(CMPI.B  #9,D1⓪(BLS     hex1⓪(SUBQ.B  #7,D1⓪(CMPI.B  #$A,D1⓪(BCS     finis⓪ !hex1   CMP.B   D5,D1⓪(BCC     finis⓪(TST     D2⓪(BMI     inval   ; zahl nicht mehr gültig⓪(MOVEQ   #1,D2   ; valid:= TRUE⓪(; Long-Multiplikation⓪(MOVE.L  D0,D6⓪(MULU    D5,D0⓪(SWAP    D6⓪(TST.W   D6⓪(BEQ     ok⓪(MULU    D5,D6⓪(SWAP    D6⓪(TST.W   D6⓪(BNE     notval⓪(ADD.L   D6,D0⓪(BCC     ok⓪ notval  MOVEQ   #-1,D2⓪ ok      ADD.L   D1,D0⓪ inval   JSR     getch⓪(BRA     hex⓪ ⓪ !finis  TST     D2⓪(BPL     ende⓪(MOVEQ   #0,D2⓪ ende⓪ END⓪ END ConvLN;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvToLNum (    get   : GetProc;⓪6VAR info  : GetInfo;⓪:base  : CARDINAL;⓪6VAR valid : BOOLEAN ): LONGCARD;⓪ BEGIN⓪ ASSEMBLER⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE.L -(A3),A1⓪(MOVE   -(A3),D5⓪(MOVE.L -(A3),A2⓪(LEA    -8(A3),A0⓪(CLR.B  GetInfo.ch(A2)⓪(MOVEQ  #0,D0⓪(MOVEQ  #0,D2⓪(JSR    skip⓪(CMPI   #1,D5⓪(BLS    err⓪(CMPI   #36,D5⓪(BHI    err⓪(JSR    ConvLN⓪ err     MOVE   D2,(A1)  ; valid⓪(SUBQ.L #8,A3⓪(MOVE.L D0,(A3)+⓪(MOVEM.L (A7)+,D3-D6⓪ END⓪ END ConvToLNum;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvToNum (    get   : GetProc;⓪4VAR info  : GetInfo;⓪8base  : CARDINAL;⓪4VAR valid : BOOLEAN ): CARDINAL;⓪ BEGIN⓪ ASSEMBLER⓪(JSR    ConvToLNum⓪(MOVE   -(A3),D0⓪(TST    -(A3)⓪(BEQ    finis⓪(CLR    (A1)     ; valid⓪ !finis  MOVE   D0,(A3)+⓪ END⓪ END ConvToNum;⓪ ⓪ ⓪ TABLE.L eins:   $000A8000,$00000000;⓪(tenpot: $0022A000,$00000000,$003AC800,$00000000,⓪0$00729C40,$00000000,$00DABEBC,$20000000,⓪0$01B28E1B,$C9BF0400,$035A9DC5,$ADA82B70,⓪0$06AAC278,$1F49FFCD,$0D5293BA,$47C980E5,⓪0$1A9AAA7E,$EBFB9DEF,$352AE319,$A0AEA5F1,⓪0$6952C976,$75868140;⓪ ⓪ (*$L-*)⓪ PROCEDURE ten(e:INTEGER; VAR valid: BOOLEAN):LONGREAL; (* / *)⓪ BEGIN⓪ ASSEMBLER⓪(;ten:= 10 ^ e⓪(MOVE   D6,-(A7)⓪(MOVE.L -(A3),A1         ;A1: ADR (valid)⓪(LEA    @LMUL,A2         ;A2: @LMUL/@LDIV⓪(MOVE   -(A3),D6⓪(BPL    check⓪(LEA    @LDIV,A2⓪(NEG    D6⓪(BPL    check⓪(CLR    D6⓪ !check  CMPI   #1232,D6⓪(BCS    ok⓪(CLR.W  (A1)             ;valid:=FALSE⓪(CLR.L  (A3)+⓪(CLR.L  (A3)+⓪(MOVE   (A7)+,D6⓪(RTS⓪ !ok     LEA    tenpot,A0        ;A0: ADR(tenpot-tbl)⓪(MOVE.L A3,A1            ;A1: ADR(result)⓪(MOVE.L eins,(A3)+⓪(CLR.L  (A3)+⓪ !lbl    BTST   #0,D6⓪(BEQ    notodd⓪(MOVEM.L A0-A2,-(A7)⓪(JSR     (A2)⓪(MOVEM.L (A7)+,A0-A2⓪ !notodd ADDQ.L #8,A0⓪(ASR    #1,D6⓪(BNE    lbl⓪(MOVE   (A7)+,D6⓪ END⓪ END ten;⓪ ⓪ (*$L+*)⓪ ⓪ (*$? ~M68881 AND ~A68881:⓪ ⓪ PROCEDURE ConvToReal(    get   : GetProc;        (* / *)⓪5VAR info  : GetInfo;⓪5VAR valid : BOOLEAN ): LONGREAL;⓪ ⓪ VAR mneg, eneg, isdigit: BOOLEAN;⓪6i: CARDINAL;⓪4exp: INTEGER;⓪6c: CHAR;⓪6x: LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪*MOVEM.L D3-D6,-(A7)⓪*BRA    start⓪*⓪"!chrget MOVE.L  A0,-(A7)⓪*MOVE.L  info(A6),(A3)+⓪*MOVE.L  get(A6),A0⓪*MOVE.L  get+4(A6),D2⓪*JSR     (A0)⓪*MOVE.L  (A7)+,A0⓪*MOVE.L  info(A6),A1⓪*MOVEQ   #0,D0⓪*MOVE.B  GetInfo.ch(A1),D0⓪*MOVE.B  D0,c(A6)⓪*SUBI.B  #'0',D0⓪*CMPI.B  #9,D0⓪*SLS     D2⓪"!nodig  MOVE.B  D2,isdigit(A6)⓪*RTS⓪*⓪"!mulx10 LEA    x(A6),A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*LEA    tenpot,A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*JSR    @RMUL⓪*MOVEQ  #0,D0⓪*MOVE.B c(A6),D0⓪*SUBI.B #'0',D0⓪*MOVE.L A3,A0⓪*ADDQ.L #8,A3⓪*JSR    @LC2D⓪*JSR    @RADD⓪*LEA    x(A6),A0⓪*MOVE.L -(A3),4(A0)⓪*MOVE.L -(A3),(A0)⓪*TST    (A0)⓪*BEQ    nosig⓪*ADDQ   #1,i(A6)⓪"!nosig  RTS⓪*⓪"!start  MOVE.L valid(A6),A1⓪*CLR    (A1)⓪"!skpblk BSR    chrget⓪*CMPI.B #' ',c(A6)⓪*BEQ    skpblk⓪*CMPI.B #9,c(A6)       ; TAB⓪*BEQ    skpblk⓪*⓪*CMPI.B #'-',c(A6)⓪*SEQ    mneg(A6)⓪*BNE    nomneg⓪*BSR    chrget⓪"!nomneg CMPI.B #'+',c(A6)⓪*BNE    nompos⓪*BSR    chrget⓪"!nompos LEA    x(A6),A0⓪*CLR.L  (A0)+⓪*CLR.L  (A0)⓪*CLR    i(A6)⓪*CLR    exp(A6)⓪"!mant1  TST.B  isdigit(A6)⓪*BEQ    point⓪*MOVE.L valid(A6),A1⓪*MOVE   #1,(A1)⓪*CMPI   #14,i(A6)⓪*BGE    dont⓪*BSR    mulx10⓪*BRA    inci⓪"!dont   ADDQ   #1,exp(A6)⓪"!inci   BSR    chrget⓪*BRA    mant1⓪"!point  MOVE.B c(A6),D0⓪*CMP.B  RadixChar,D0⓪*BNE    expon⓪*BSR    chrget⓪"!mant2  TST.B  isdigit(A6)⓪*BEQ    expon⓪*MOVE.L valid(A6),A1⓪*MOVE   #1,(A1)⓪*CMPI   #14,i(A6)⓪*BGE    dont1⓪*BSR    mulx10⓪*SUBQ   #1,exp(A6)⓪"!dont1  BSR    chrget⓪*BRA    mant2⓪"!expon  CMPI.B #'E',c(A6)⓪*BEQ    expon0⓪*CMPI.B #'e',c(A6)⓪*BNE    retrn⓪"!expon0 BSR    chrget⓪*CMPI.B #'-',c(A6)⓪*SEQ    eneg(A6)⓪*BNE    noeneg⓪*BSR    chrget⓪"!noeneg CMPI.B #'+',c(A6)⓪*BNE    noepos⓪*BSR    chrget⓪"!noepos CLR    i(A6)⓪"!expon1 TST.B  isdigit(A6)⓪*BEQ    expon2⓪*MOVE   i(A6),D0⓪*MULU   #10,D0⓪*MOVE.B c(A6),D1⓪*ANDI   #$F,D1⓪*ADD    D1,D0⓪*MOVE   D0,i(A6)⓪*BSR    chrget⓪*BRA    expon1⓪"!expon2 MOVE   i(A6),D0⓪*TST.B  eneg(A6)⓪*BEQ    expon3⓪*NEG    D0⓪"!expon3 ADD    D0,exp(A6)⓪"!retrn  TST.B  mneg(A6)⓪*BEQ    retrn1⓪*TST    x(A6)⓪*BEQ    retrn1⓪*BSET   #0,x+1(A6)     ;jm 14.6.⓪"!retrn1 MOVEM.L (A7)+,D3-D6⓪"END;⓪"RETURN x * ten(exp,valid)⓪ END ConvToReal;⓪ ⓪%(* <-- 68000 *) *)⓪ ⓪ (*$? M68881 OR A68881:⓪ ⓪ PROCEDURE ConvToReal(    get   : GetProc;        (* / *)⓪5VAR info  : GetInfo;⓪5VAR valid : BOOLEAN ): LONGREAL;⓪ ⓪ VAR mneg, eneg, isdigit: BOOLEAN;⓪6i: CARDINAL;⓪4exp: INTEGER;⓪6c: CHAR;⓪6x: LONGREAL;⓪ BEGIN⓪"ASSEMBLER⓪"(*$? M68881:⓪*FMOVE.L FPCR,-(A7)⓪*FMOVE.L #0,FPCR               ; keine Exceptions auslösen⓪"*)⓪*MOVE.L D3,-(A7)⓪*BRA.L  start⓪ ⓪"!chrget MOVE.L  A0,-(A7)⓪*MOVE.L  info(A6),(A3)+⓪*MOVE.L  get(A6),A0⓪*MOVE.L  get+4(A6),D2⓪*JSR     (A0)⓪*MOVE.L  (A7)+,A0⓪*MOVE.L  info(A6),A1⓪*MOVEQ   #0,D0⓪*MOVE.B  GetInfo.ch(A1),D0⓪*MOVE.B  D0,c(A6)⓪*SUBI.B  #'0',D0⓪*CMPI.B  #9,D0⓪*SLS     D2⓪"!nodig  MOVE.B  D2,isdigit(A6)⓪*RTS⓪ ⓪"(*$? M68881:⓪"Error   MOVE.L valid(A6),A1⓪*CLR.W  (A1)⓪*RTS⓪"!mulx10 (* x in FP0 *)⓪*FMOVE.L #0,FPSR               ; Accrued Exc Byte löschen⓪*FMUL.W #10,FP0⓪*MOVEQ  #0,D0⓪*MOVE.B c(A6),D0⓪*SUBI.B #'0',D0⓪*FADD.W D0,FP0⓪*FMOVE.L FPSR,D0⓪*ANDI.B  #11010000%,D0 ; InvalidOperation, Overflow oder DivByZero?⓪*BNE     Error⓪*RTS⓪"*)⓪"(*$? A68881:⓪#Error  MOVE.L valid(A6),A1⓪*CLR.W  (A1)⓪*JMP    FPUReset⓪"!mulx10 (* x in FP0 *)⓪*MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    mulx10⓪*MOVE.W #$5023,fpcmd ; FMUL.W⓪"!mulxl  MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    mulxl⓪*SUBQ.B #2,D0⓪*BNE    Error⓪*MOVE.W #10,fpop    ; #10⓪*MOVEQ  #0,D2⓪*MOVE.B c(A6),D2⓪*TST.W  fpstat⓪*SUBI.B #'0',D2⓪#!addx2 MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    addx2⓪*MOVE.W #$5022,fpcmd ; FADD.W⓪#!addxl MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    addxl⓪*SUBQ.B #2,D0⓪*BNE    Error⓪*MOVE.W D2,fpop     ; digit addieren⓪#!addx3 MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    addx3⓪*SUBQ.B #2,D0⓪*BNE    Error⓪*RTS⓪#⓪#protViol⓪*JSR    FPUError⓪*BRA.W  error2⓪"*)⓪ ⓪"!start  MOVE.L valid(A6),A1⓪*CLR    (A1)⓪"!skpblk BSR    chrget⓪*CMPI.B #' ',c(A6)⓪*BEQ    skpblk⓪*CMPI.B #9,c(A6)       ; TAB⓪*BEQ    skpblk⓪*⓪*CMPI.B #'-',c(A6)⓪*SEQ    mneg(A6)⓪*BNE    nomneg⓪*BSR    chrget⓪"!nomneg CMPI.B #'+',c(A6)⓪*BNE    nompos⓪*BSR    chrget⓪*⓪"(*$? M68881:⓪"!nompos⓪*FMOVE.W #0,FP0⓪"*)⓪"(*$? A68881:⓪"!nompos MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ     nompos⓪*SUBQ.B  #2,D0⓪*BEQ     noError⓪*JSR     FPUError⓪"noError MOVE.W  #$5C0F,fpcmd ; FMOVECR 0.0,FP0⓪"waitFpu MOVE.W  fpstat,D0⓪*TST.B   D0⓪*BEQ     waitFpu⓪*SUBQ.B  #2,D0⓪*BNE     protViol⓪"*)⓪*CLR    exp(A6)⓪"!mant1  TST.B  isdigit(A6)⓪*BEQ    point⓪*MOVE.L valid(A6),A1⓪*MOVE   #1,(A1)⓪*BSR    mulx10⓪*MOVE.L valid(A6),A1⓪*TST.W  (A1)⓪*BEQ.W  error2⓪"!inci   BSR    chrget⓪*BRA    mant1⓪"!point  MOVE.B c(A6),D0⓪*CMP.B  RadixChar,D0⓪*BNE    expon⓪*BSR    chrget⓪"!mant2  TST.B  isdigit(A6)⓪*BEQ    expon⓪*MOVE.L valid(A6),A1⓪*MOVE   #1,(A1)⓪*BSR    mulx10⓪*SUBQ   #1,exp(A6)⓪"!dont1  BSR    chrget⓪*BRA    mant2⓪"!expon  CMPI.B #'E',c(A6)⓪*BEQ    expon0⓪*CMPI.B #'e',c(A6)⓪*BNE    retrn⓪"!expon0 BSR    chrget⓪*CLR    eneg(A6)⓪*CMPI.B #'-',c(A6)⓪*SEQ    eneg(A6)⓪*BNE    noeneg⓪*BSR    chrget⓪"!noeneg CMPI.B #'+',c(A6)⓪*BNE    noepos⓪*BSR    chrget⓪"!noepos CLR    D3⓪"!expon1 TST.B  isdigit(A6)⓪*BEQ    expon2⓪*MULU   #10,D3⓪*MOVE.B c(A6),D1⓪*ANDI   #$F,D1⓪*ADD    D1,D3⓪*BSR    chrget⓪*BRA    expon1⓪"!expon2⓪*TST.B  eneg(A6)⓪*BEQ    expon3⓪*NEG    D3⓪"!expon3 ADD.W  exp(A6),D3⓪*MOVE.W D3,D0⓪*BPL    testex⓪*NEG    D0⓪"!testex CMPI.W #307,D0⓪*BLE    expon4⓪*MOVE.L valid(A6),A1⓪*CLR.W  (A1)⓪"!expon4 MOVE.W D3,exp(A6)⓪"!retrn  TST.B  mneg(A6)⓪*BEQ    retrn1⓪ (*$? M68881:⓪*FMOVE.L #0,FPSR               ; Accrued Exc Byte löschen⓪*FTST.X FP0⓪*FBEQ   retrn1⓪*FNEG.X FP0⓪"!retrn1 MOVE.L  (A7)+,D3⓪*FTENTOX.W exp(A6),FP1⓪*FMUL.X FP1,FP0⓪*FMOVE.D FP0,x(A6)⓪*FMOVE.L FPSR,D0⓪*FMOVE.L (A7)+,FPCR⓪*ANDI.B  #11010000%,D0 ; InvalidOperation, Overflow oder DivByZero?⓪*BEQ     ende⓪*MOVE.L  valid(A6),A1⓪*CLR     (A1)⓪*BRA     error3⓪"error2  MOVE.L  (A7)+,D3⓪*FMOVE.L (A7)+,FPCR⓪"error3  CLR.L   x(A6)⓪*CLR.L   x+4(A6)⓪ *)⓪ (*$? A68881:⓪"!tst2   MOVE.W fpstat,D3⓪*TST.B  D3⓪*BEQ    tst2⓪*MOVE.W #$3A,fpcmd ; FTST FP0⓪"!tstl   MOVE.W fpstat,D3⓪*TST.B  D3⓪*BEQ    tstl⓪*MOVE.W #1,fpcond      ; FBEQ retrn1⓪*MOVE.W fpstat,D3     ; Response⓪*CMPI.W #$0802,fpstat⓪*BNE    protviol⓪*TST.B  D3⓪*BNE    retrn1⓪*MOVE.W #$1A,fpcmd   ; FNEG FP0⓪"!retrn1 MOVE.L (A7)+,D3⓪"!negl   MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    negl⓪*MOVE.W #$5092,fpcmd ; FTENTOX.W ?,FP1⓪"!tenl   MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    tenl⓪*SUBQ.B #2,D0⓪*BNE    error1⓪*MOVE.W exp(A6),fpop⓪"!neg2   MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    neg2⓪*MOVE.W #$423,fpcmd  ; FMUL  FP1,FP0⓪"!mull   MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    mull⓪*MOVE.W #$7400,fpcmd ; FMOVE.D FP0,?⓪"!movl1  MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    movl1⓪*SUBQ.B #8,D0⓪*BNE    error1⓪*MOVE.L fpop,x(A6)⓪*TST.W  fpstat⓪*MOVE.L fpop,x+4(A6)⓪$movl2 MOVE.W fpstat,D0⓪*TST.B  D0⓪*BEQ    movl2⓪*SUBQ.B #2,D0⓪*BEQ    Ende⓪*BRA    Error1⓪"Error2  MOVE.L (A7)+,D3⓪"Error1  JSR    FPUReset⓪*CLR.L  x(A6)⓪*CLR.L  x+4(A6)⓪*MOVE.L valid(A6),A0⓪*CLR.W  (A0)⓪ *)⓪&Ende⓪"END;⓪"RETURN x⓪ END ConvToReal;⓪ ⓪$(*  <-- 68020 *) *)⓪ ⓪ (*$L-*)⓪ PROCEDURE reverse; (* ^str:A0, High(str):D5, space:D6, len(str):D4 *)⓪ BEGIN⓪ ASSEMBLER⓪(LEA    0(A0,D4.W),A1⓪(SUBQ   #1,D6⓪(BCS    revers⓪(CMP    D5,D6⓪(BHI    error⓪(SUB    D4,D6⓪(BCS    revers⓪(MOVE   D5,D1⓪(SUB    D4,D1⓪(BCS    revers⓪(MOVE   D7,D0⓪ !spclp  MOVE.B D0,(A1)+⓪(ADDQ   #1,D4⓪(SUBQ   #1,D1⓪(DBCS   D6,spclp⓪ !revers MOVE.L A0,-(A7)⓪ loop0   MOVE.B (A0),D0⓪(MOVE.B -(A1),(A0)+⓪(MOVE.B D0,(A1)⓪(CMPA.L A0,A1⓪(BHI    loop0⓪(MOVE.L (A7)+,A0⓪(CMP    D5,D4⓪(BHI    finis⓪(CLR.B  0(A0,D4.W)⓪(BRA    finis⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000  ; string overflow⓪ finis   MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪ END⓪ END reverse;⓪ ⓪ (*$L-*)⓪ PROCEDURE LCToStr; (* lc:D3.L, ^str:A0, High(str):D5  => D4:len(str) *)⓪ BEGIN⓪ ASSEMBLER⓪(; D6 erhalten !⓪(MOVEQ  #0,D4⓪ !lbl    CMP    D5,D4⓪(BHI    error⓪(MOVEQ  #10,D0⓪(MOVE.L D3,D1⓪(MOVEQ  #0,D2⓪(MOVEQ  #0,D3⓪ !cd1    CMP.L  D0,D1⓪(BLS    cd2⓪(ADDQ   #1,D2⓪(ASL.L  #1,D0⓪(BPL    cd1⓪ !cd2    ASL.L  #1,D3⓪(CMP.L  D0,D1⓪(BCS    cd3⓪(SUB.L  D0,D1⓪(ADDQ.B #1,D3⓪ !cd3    LSR.L  #1,D0⓪(DBF    D2,cd2⓪(ADDI   #'0',D1⓪(MOVE.B D1,0(A0,D4.W)⓪(ADDQ   #1,D4⓪(TST.L  D3⓪(BNE    lbl⓪(RTS⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000  ; string overflow⓪ END⓪ END LCToStr;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvCard(lc:LONGCARD; space:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D7,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(MOVE   -(A3),D6         ; space⓪(MOVE.L -(A3),D3         ; lc⓪(JSR    LCToStr⓪(MOVEQ  #' ',D7⓪(JMP    reverse⓪ END⓪ END ConvCard;⓪ ⓪ (*$L-*)⓪ PROCEDURE LItoStr;⓪ BEGIN⓪ ASSEMBLER⓪(TST.L  D3⓪(BPL    notneg⓪(NEG.L  D3⓪(SUBQ.L #1,D5            ; HIGH verringern für '-' Zeichen⓪(BCS    error⓪(JSR    LCToStr⓪(ADDQ   #1,D5⓪(MOVE.B #'-',0(A0,D4.W)⓪(ADDQ   #1,D4⓪(BRA    finis⓪ !notneg JSR    LCToStr⓪ !finis  MOVEQ  #' ',D7⓪(JMP    reverse⓪ error   TRAP    #6⓪(DC.W    StringOverflow-$4000  ; string overflow⓪(MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪ END⓪ END LIToStr;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvInt(i:LONGINT; space:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D7,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(MOVE   -(A3),D6         ; space⓪(MOVE.L -(A3),D3⓪(JMP    LItoStr⓪ END⓪ END ConvInt;⓪ ⓪ (*$L-*)⓪ PROCEDURE LHtoStr;⓪ BEGIN⓪ ASSEMBLER⓪(MOVEQ  #0,D2⓪(SUBQ   #1,D0⓪ !lbl    CMP    D5,D2⓪(BEQ    error⓪(MOVE.B D1,D3⓪(ANDI.B #$F,D3⓪(ORI.B  #'0',D3⓪(CMPI.B #'9',D3⓪(BLS    noadd⓪(ADDQ.B #7,D3⓪ !noadd  MOVE.B D3,0(A0,D2.W)⓪(ADDQ.B #1,D2⓪(BMI    dollar           ; Falls space zu groß⓪(SUBQ   #1,D0⓪(LSR.L  #4,D1⓪(BNE    lbl⓪(TST    D0⓪(BGT    lbl⓪ dollar  MOVE.B #'$',0(A0,D2.W)⓪(LEA    1(A0,D2.W),A1⓪ !revers MOVE.L A0,-(A7)⓪ l       MOVE.B (A0),D1⓪(MOVE.B -(A1),(A0)+⓪(MOVE.B D1,(A1)⓪(CMPA.L A0,A1⓪(BHI    l⓪(MOVE.L (A7)+,A0⓪(CMP    D5,D2⓪(BEQ    finis⓪(CLR.B  1(A0,D2.W)⓪(BRA    finis⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000  ; string overflow⓪ !finis  MOVEM.L (A7)+,D3-D6⓪(UNLK    A5⓪ END⓪ END LHtoStr;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvLHex(l:LONGWORD; space:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(MOVE   -(A3),D0         ; space⓪(MOVE.L -(A3),D1         ; l⓪(JMP    LHToStr⓪ END⓪ END ConvLHex;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvHex(w:WORD; space:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(MOVE   -(A3),D0         ; space⓪(MOVEQ  #0,D1⓪(MOVE   -(A3),D1⓪(JMP    LHToStr⓪ END⓪ END ConvHex;⓪ ⓪ (*$L-*)⓪ PROCEDURE LBToStr;⓪ BEGIN⓪ ASSEMBLER⓪(MOVEQ  #0,D2⓪(SUBQ   #1,D0⓪ !lbl    CMP    D5,D2⓪(BEQ    error⓪(MOVE.B D1,D3⓪(ANDI.B #$1,D3⓪(ORI.B  #'0',D3⓪(MOVE.B D3,0(A0,D2.W)⓪(ADDQ.B #1,D2⓪(BMI    proznt           ; Falls space zu groß⓪(SUBQ   #1,D0⓪(LSR.L  #1,D1⓪(BNE    lbl⓪(TST    D0⓪(BGT    lbl⓪ !proznt MOVE.B #'%',0(A0,D2.W)⓪(LEA    1(A0,D2.W),A1⓪ !revers MOVE.L A0,-(A7)⓪ l       MOVE.B (A0),D1⓪(MOVE.B -(A1),(A0)+⓪(MOVE.B D1,(A1)⓪(CMPA.L A0,A1⓪(BHI    l⓪(MOVE.L (A7)+,A0⓪(CMP    D5,D2⓪(BEQ    finis⓪(CLR.B  1(A0,D2.W)⓪(BRA    finis⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000  ; string overflow⓪ !finis  MOVEM.L (A7)+,D3-D6⓪(UNLK    A5⓪ END⓪ END LBToStr;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvLBin(l:LONGWORD; space:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(MOVE   -(A3),D0         ; space⓪(MOVE.L -(A3),D1         ; l⓪(JMP    LBToStr⓪ END⓪ END ConvLBin;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvBin(W:WORD; space:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D6,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(MOVE   -(A3),D0         ; space⓪(MOVEQ  #0,D1⓪(MOVE   -(A3),D1⓪(JMP    LBToStr⓪ END⓪ END ConvBin;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvLNum(l:LONGWORD; base,space:CARDINAL; fillCh: CHAR;⓪(VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D7,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(SUBQ.L #1,A3⓪(MOVE.B -(A3),D7         ; fillCh⓪(MOVE   -(A3),D6         ; space⓪(MOVEQ  #0,D2⓪(MOVE   -(A3),D2         ; base⓪(MOVE.L -(A3),D1         ; l⓪(CMPI   #1,D2⓪(BLS    err⓪(CMPI   #36,D2⓪(BLS    ok⓪ ⓪ err     CLR.B  (A0)⓪(TRAP   #6⓪(DC.W   OutOfRange-$4000⓪(MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪(RTS⓪ ⓪ ok      MOVEQ  #0,D4⓪ !lbl    CMP    D5,D4            ; HIGH (str) erreicht ?⓪(BHI    error⓪(MOVE.L D1,(A3)+⓪(MOVE.L D2,(A3)+⓪(MOVEM.L D1/D2,-(A7)⓪(JSR    @CMOD⓪(MOVEM.L (A7)+,D1/D2⓪(MOVE.L -(A3),D3⓪(ADDI.B #'0',D3⓪(CMPI.B #'9',D3⓪(BLS    noadd⓪(ADDQ.B #7,D3⓪ !noadd  MOVE.B D3,0(A0,D4.W)⓪(ADDQ.B #1,D4⓪(BMI    revers           ; Falls space zu groß⓪(MOVE.L D1,(A3)+⓪(MOVE.L D2,(A3)+⓪(MOVEM.L D1-D2,-(A7)⓪(JSR    @CDIV⓪(MOVEM.L (A7)+,D1-D2⓪(MOVE.L -(A3),D1⓪(BNE    lbl⓪ revers  JMP    reverse⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000  ; string overflow⓪ !finis  MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪ END⓪ END ConvLNum;⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvNum(w:WORD; base,space:CARDINAL; fillCh: CHAR;⓪0VAR str: ARRAY OF CHAR);⓪ BEGIN⓪ ASSEMBLER⓪(LINK   A5,#0⓪(MOVEM.L D3-D7,-(A7)⓪(MOVE   -(A3),D5         ; HIGH (str)⓪(MOVE.L -(A3),A0         ; ^str⓪(SUBQ.L #1,A3⓪(MOVE.B -(A3),D7         ; fillCh⓪(MOVE   -(A3),D6         ; space⓪(MOVE   -(A3),D2         ; base⓪(MOVEQ  #0,D1⓪(MOVE   -(A3),D1         ; w⓪(CMPI   #1,D2⓪(BLS    err⓪(CMPI   #36,D2⓪(BLS    ok⓪ ⓪ err     CLR.B  (A0)⓪(TRAP   #6⓪(DC.W   OutOfRange-$4000⓪(MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪(RTS⓪ ⓪ ok      MOVEQ  #0,D4⓪ !lbl    CMP    D5,D4            ; HIGH (str) erreicht ?⓪(BHI    error⓪(DIVU   D2,D1⓪(SWAP   D1⓪(ADDI.B #'0',D1⓪(CMPI.B #'9',D1⓪(BLS    noadd⓪(ADDQ.B #7,D1⓪ !noadd  MOVE.B D1,0(A0,D4.W)⓪(ADDQ.B #1,D4⓪(BMI    revers           ; Falls space zu groß⓪(CLR    D1⓪(SWAP   D1⓪(BNE    lbl⓪ revers  JMP    reverse⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000  ; string overflow⓪ !finis  MOVEM.L (A7)+,D3-D7⓪(UNLK    A5⓪ END⓪ END ConvNum;⓪ ⓪ ⓪ (*$? ~M68881 AND ~A68881:⓪ ⓪ TABLE.L zehntel:    $FFEACCCC,$CCCCCCCC;⓪(half:       $00028000,$00000000;⓪(roundkonst: $FFE2CCCC,$CCCCCCCC,$FFCAA3D7,$0A3D70A3,⓪4$FFB28312,$6E978D2F,$FF92D1B7,$1758E219,⓪4$FF7AA7C5,$AC471B47,$FF628637,$BD05AF6C,⓪4$FF42D6BF,$94D5E57A,$FF2AABCC,$77118461,⓪4$FF128970,$5F4136B4,$FEF2DBE6,$FECEBDED,⓪4$FEDAAFEB,$FF0BCB24,$FEC28CBC,$CC096F50,⓪4$FEA2E12E,$13424BB4,$FE8AB424,$DC358000;⓪ ⓪ (*$L-*)⓪ PROCEDURE norm;⓪"(*⓪&normiert Realzahl (A2) auf 0.1 <= (A2) < 1.0;⓪&korrigert dabei Integer-Exponent (A1).⓪"*)⓪ BEGIN⓪ ASSEMBLER⓪(;0.1<=x<1.0⓪(;A1:=^e; A2:=^x⓪(MOVE.L A1,-(A7)⓪(MOVE.L A2,-(A7)⓪ !norm0  MOVE.L (A7),A1⓪(LEA    eins,A0⓪(JSR    @LRGE⓪(TST    D0⓪(BEQ    norm1⓪(MOVE.L (A7),A1⓪(LEA    tenpot,A0⓪(JSR    @LDIV⓪(MOVE.L 4(A7),A1⓪(ADDQ   #1,(A1)⓪(BRA    norm0⓪ !norm1  MOVE.L (A7),A1⓪(LEA    zehntel,A0⓪(JSR    @LRLT⓪(TST    D0⓪(BEQ    norm2⓪(MOVE.L (A7),A1⓪(LEA    tenpot,A0⓪(JSR    @LMUL⓪(MOVE.L 4(A7),A1⓪(SUBQ   #1,(A1)⓪(BRA    norm1⓪ !norm2  ADDQ.L #8,A7⓪ END⓪ END norm;⓪ ⓪ ⓪ (*$L-*)⓪ PROCEDURE put;⓪ BEGIN⓪ ASSEMBLER⓪(;ein Zeichen in <line> zuweisen⓪(;A0:=^Str, D0:=Zeichen⓪(MOVE    LStr.l(A0),D6⓪(CMP     LStr.h(A0),D6⓪(BHI     overfl⓪(ADDQ    #1,LStr.l(A0)⓪(MOVE.L  LStr.p(A0),A1⓪(MOVE.B  D0,0(A1,D6.W)⓪(CMP     D0,D0           ; liefert EQ⓪ overfl                          ; liefert NE⓪ END⓪ END put;⓪ ⓪ (*$L-*)⓪ PROCEDURE digit;⓪ BEGIN⓪ ASSEMBLER⓪(CMPI   #13,D5⓪(BLS    ok⓪(MOVEQ  #0,D0⓪(BEQ    digout⓪ !ok     ADDQ   #1,D5⓪(MOVE.L D0,D2    ;A0=^line, (D0,D1)=x⓪(MOVE.L D1,D3    ;benutzt D2,D3⓪(ASL.L  #1,D3    ;D5=Zaehler⓪(ROXL.L #1,D2⓪(ASL.L  #1,D3⓪(ROXL.L #1,D2⓪(ADD.L  D3,D1⓪(ADDX.L D2,D0⓪(ASL.L  #1,D1⓪(ROXL.L #1,D0⓪(SWAP   D0⓪ !digout ORI    #'0',D0⓪(JSR    put⓪(BNE    finis⓪(CLR    D0⓪(SWAP   D0⓪(CMP    D0,D0    ; liefert EQ⓪ finis⓪ END⓪ END digit;⓪ ⓪ (*$L-*)⓪ PROCEDURE bintodezexp;⓪ BEGIN⓪ ASSEMBLER⓪(ASR.W  #3,D2    ;jm 15.6.⓪(; EXT.L  D2⓪(BPL    noadd⓪(ADDQ.L #1,D2⓪ !noadd  MULS   #77,D2⓪(ASR.L  #0,D2    ;das sind natürlich 8 Shifts! 77/256 ~ log 2⓪(BMI    noadd1⓪(ADDQ   #1,D2⓪ !noadd1⓪ END⓪ END bintodezexp;⓪ ⓪ (*$L-*)⓪ PROCEDURE insSpc ( VAR lin:ARRAY OF CHAR; len:Cardinal; spc:Cardinal );⓪ (* ^str:A0, High(str):D5, space:D6, len(str):D4 *)⓪ BEGIN⓪ ASSEMBLER⓪(MOVE   -(A3),D6⓪(MOVE   -(A3),D4⓪(MOVE   -(A3),D5⓪(MOVE.L -4(A3),A0⓪(⓪(LEA    0(A0,D4.W),A1⓪ rev2    MOVE.B (A0),D0⓪(MOVE.B -(A1),(A0)+⓪(MOVE.B D0,(A1)⓪(CMPA.L A0,A1⓪(BHI    rev2⓪(⓪(MOVE.L -(A3),A0⓪(⓪(LEA    0(A0,D4.W),A1⓪(SUBQ   #1,D6⓪(BCS    revers⓪(CMP    D5,D6⓪(BHI    error⓪(SUB    D4,D6⓪(BCS    revers⓪(MOVE   D5,D1⓪(SUB    D4,D1⓪(BCS    revers⓪(MOVEQ  #' ',D0⓪ !spclp  MOVE.B D0,(A1)+⓪(ADDQ   #1,D4⓪(SUBQ   #1,D1⓪(DBCS   D6,spclp⓪ !revers MOVE.L A0,-(A7)⓪ l       MOVE.B (A0),D0⓪(MOVE.B -(A1),(A0)+⓪(MOVE.B D0,(A1)⓪(CMPA.L A0,A1⓪(BHI    l⓪(MOVE.L (A7)+,A0⓪(CMP    D5,D4⓪(BHI    finis⓪(CLR.B  0(A0,D4.W)⓪(BRA    finis⓪ error   TRAP   #6⓪(DC.W   StringOverflow-$4000 ; string overflow⓪ finis⓪ END⓪ END insSpc;⓪ ⓪ (*$L+*)⓪ PROCEDURE ConvFloat(x:LONGREAL; space,n:CARDINAL; VAR lin: ARRAY OF CHAR);⓪ VAR e:INTEGER; line:LStr;⓪ BEGIN⓪"ASSEMBLER⓪*;1 Stelle vor, n nach Komma, E+-DDDD⓪*⓪*MOVEM.L D3-D6,-(A7)⓪*⓪*MOVE.L lin(A6),line.p(A6)⓪*MOVE.W lin+4(A6),line.h(A6)  ; HIGH (lin)⓪*CLR.W  line.l(A6)⓪*⓪*LEA    line(A6),A0⓪*MOVE   x(A6),D2⓪*BNE    notzer⓪*MOVEQ  #'0',D0      ;x = 0.0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.B RadixChar,D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVEQ  #'0',D0⓪*MOVE   n(A6),D1⓪*BEQ    nozero⓪"!zeros  JSR    put⓪*BNE.L  overfl⓪*SUBQ   #1,D1⓪*BNE    zeros⓪"!nozero MOVE   #1,e(A6)⓪*BRA.L  putexp⓪"!notzer BCLR   #0,D2         ;jm 14.6.⓪*BEQ    notneg⓪*MOVE   D2,x(A6)      ;x < 0.0: jetzt positiv gemacht⓪*MOVEQ  #'-',D0⓪*JSR    put⓪*BNE.L  overfl⓪"!notneg JSR    bintodezexp⓪*MOVE   D2,e(A6)⓪*LEA    x(A6),A0      ;x:=x/ten(e)⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*MOVE   D2,(A3)+⓪*SUBQ.L #2,A7⓪*MOVE.L A7,(A3)+    ;'valid'-Para; nur dummy, weil Overflow unmöglich⓪*JSR    ten⓪*ADDQ.L #2,A7⓪*JSR    @RDIV⓪*LEA    x(A6),A2     ;0.1<=x<1.0⓪*MOVE.L -(A3),4(A2)⓪*MOVE.L -(A3),(A2)⓪*LEA    e(A6),A1⓪*JSR    norm⓪*MOVE   n(A6),D0     ;Runden: Anzahl Nachkommastellen⓪*CMPI   #13,D0⓪*BLS    okrund⓪*MOVEQ  #13,D0⓪"!okrund ASL    #3,D0⓪*LEA    roundkonst,A0⓪*ADDA   D0,A0          ;Zugriff auf 0.5 / 10^(n+1)⓪@; (beachte 0.1 <= Zahl < 1.0, daher n+1)⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*LEA    x(A6),A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*JSR    @RADD           ;0.1<=x<1.0⓪*LEA    x(A6),A2⓪*MOVE.L -(A3),4(A2)⓪*MOVE.L -(A3),(A2)⓪*LEA    e(A6),A1⓪*JSR    norm⓪*LEA    x(A6),A0        ;trunc(x) in 48-bit Mantisse⓪*MOVE.L (A0)+,D0⓪*MOVE.L (A0),D1⓪*SWAP   D0⓪*MOVE   D0,D2          ;Exponentenwort⓪*CLR    D0⓪*SWAP   D0             ;in D0 Exp.wort geloescht⓪*⓪*ASR    #3,D2⓪*BPL    finis          ;bei Exp >= 0 fertig⓪*NOT    D2             ;Exp -1 ergibt Zählwert 0 in D2 (NEG D2, DEC D2)⓪*; SUBI   #$0FFF,D2⓪*; BGT    finis        ;bei Exp > -1 fertig⓪*; NEG    D2⓪"⓪"!shr    LSR    #1,D0⓪*ROXR.L #1,D1⓪*DBF    D2,shr⓪*BCC    finis          ;evtl. aufrunden⓪*ADDQ.L #1,D1⓪*BCC    finis⓪*ADDQ.W #1,D0⓪"!finis  LEA    line(A6),A0    ;Vorkommastelle berechnen⓪*MOVEQ  #0,D5⓪*JSR    digit⓪*BNE.L  overfl⓪*MOVE.L D0,D2⓪*MOVE   n(A6),D4⓪*BEQ    putexp⓪*MOVE.B RadixChar,D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.L D2,D0⓪"!putman JSR    digit          ;n Nachkommastellen berechnen⓪*BNE.L  overfl⓪*SUBQ   #1,D4⓪*BNE    putman⓪"!putexp SUBQ   #1,e(A6)⓪*MOVEQ  #'E',D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVEQ  #'+',D0⓪*MOVE   e(A6),D1⓪*BPL    posit⓪*NEG    D1⓪*MOVEQ  #'-',D0⓪"!posit  JSR    put⓪*BNE.L  overfl⓪*MOVE   D1,D0⓪*MOVEQ  #'0',D1⓪*DIVU   #1000,D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE.L  overfl⓪*CLR    D0⓪*SWAP   D0⓪*DIVU   #100,D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE.L  overfl⓪*CLR    D0⓪*SWAP   D0⓪*DIVU   #10,D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE    overfl⓪*SWAP   D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE    overfl⓪"END;⓪"insSpc (lin,line.l,space);⓪"ASSEMBLER⓪*BRA    ende⓪"overfl  TRAP   #6⓪*DC.W   StringOverflow-$4000 ; string overflow⓪"ende    MOVEM.L (A7)+,D3-D6⓪"END⓪ END ConvFloat;⓪ ⓪ (*$L+*)⓪ PROCEDURE ConvEng(x:LONGREAL; space,n:CARDINAL; VAR lin: ARRAY OF CHAR);⓪ VAR line:LStr;⓪$e:INTEGER;⓪ BEGIN⓪"ASSEMBLER⓪*;1-3 Stelle vor, n nach Komma, E+-DDDD⓪*⓪*MOVEM.L D3-D6,-(A7)⓪*⓪*MOVE.L lin(A6),line.p(A6)⓪*MOVE.W lin+4(A6),line.h(A6)  ; HIGH (lin)⓪*CLR.W  line.l(A6)⓪*⓪*LEA    line(A6),A0⓪*MOVE   x(A6),D2⓪*BNE    notzer⓪*MOVEQ  #'0',D0      ;x = 0.0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.B RadixChar,D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVEQ  #'0',D0⓪*MOVE   n(A6),D1⓪*BEQ    nozero⓪"!zeros  JSR    put⓪*BNE.L  overfl⓪*SUBQ   #1,D1⓪*BNE    zeros⓪"!nozero CLR    e(A6)⓪*BRA.L  putexp⓪"!notzer BCLR   #0,D2         ;jm 14.6.⓪*BEQ    notneg⓪*MOVE   D2,x(A6)⓪*MOVEQ  #'-',D0⓪*JSR    put⓪*BNE.L  overfl⓪"⓪"!notneg JSR    bintodezexp⓪*MOVE   D2,e(A6)⓪*LEA    x(A6),A0      ;x:=x/ten(e)⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*MOVE   D2,(A3)+⓪*SUBQ.L #2,A7⓪*MOVE.L A7,(A3)+    ;'valid'-Para; nur dummy, weil Overflow unmöglich⓪*JSR    ten⓪*ADDQ.L #2,A7⓪*JSR    @RDIV⓪*LEA    x(A6),A2     ;0.1<=x<1.0⓪*MOVE.L -(A3),4(A2)⓪*MOVE.L -(A3),(A2)⓪*LEA    e(A6),A1⓪*JSR    norm         ;0.1<=x<1.0⓪*MOVE   n(A6),D0     ;Runden⓪*⓪*; zusätzlich zu Nachkommastellen haben wir e MOD 3 Vorkommastellen;⓪*; Rundung soll hinter der letzten ausgegebenen Ziffer erfolgen⓪*⓪*MOVEQ  #0,D1        ; berechne e MOD 3⓪*MOVE   e(A6),D1⓪*ADD    #1235,D1⓪*DIVU   #3,D1⓪*SWAP   D1⓪)⓪*ADD    D1,D0        ; addieren zur Gesamtstellenzahl⓪*ADDQ   #1,D0⓪*CMPI   #14,D0⓪*BLS    okrund⓪*MOVEQ  #14,D0⓪"!okrund ASL    #3,D0⓪*LEA    roundkonst,A0  ; dummy, um Weg-Optimierung zu verhindern⓪*LEA    half,A0⓪*ADDA   D0,A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*LEA    x(A6),A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*JSR    @RADD⓪*LEA    x(A6),A2⓪*MOVE.L -(A3),4(A2)⓪*MOVE.L -(A3),(A2)⓪*LEA    e(A6),A1⓪*JSR    norm⓪ noRund    LEA    x(A6),A0        ;trunc(x) in 48-bit Mantisse⓪*MOVE.L (A0)+,D0⓪*MOVE.L (A0),D1⓪*SWAP   D0⓪*MOVE   D0,D2⓪*CLR    D0⓪*SWAP   D0⓪*⓪*ASR    #3,D2⓪*BPL    finis          ;bei Exp >= 0 fertig⓪*NOT    D2             ;Exp -1 ergibt Zählwert 0 in D2 (NEG D2, DEC D2)⓪*; SUBI   #$0FFF,D2⓪*; BGT    finis        ;bei Exp > -1 fertig⓪*; NEG    D2⓪"⓪"!shr    LSR    #1,D0⓪*ROXR.L #1,D1⓪*DBF    D2,shr⓪*BCC    finis          ;evtl. aufrunden⓪*ADDQ.L #1,D1⓪*BCC    finis⓪*ADDQ.W #1,D0⓪"!finis  LEA    line(A6),A0    ;1-3 Vorkommastellen berechnen⓪*MOVEQ  #0,D5          ;Zaehler fuer ausgegebene Stellen⓪"!putvor JSR    digit⓪*BNE.L  overfl⓪*MOVEQ  #0,D4⓪*MOVE   e(A6),D4⓪*SUBQ   #1,D4⓪*MOVE   D4,e(A6)⓪*ADD    #1233,D4⓪*DIVU   #3,D4⓪*SWAP   D4⓪*TST    D4⓪*BNE    putvor⓪*MOVE   n(A6),D4⓪*BEQ    putexp⓪*MOVE.L D0,D2⓪*MOVE.B RadixChar,D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.L D2,D0⓪"!putman JSR    digit          ;n Nachkommastellen berechnen⓪*BNE.L  overfl⓪*SUBQ   #1,D4⓪*BNE    putman⓪"!putexp MOVEQ  #'E',D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVEQ  #'+',D0⓪*MOVE   e(A6),D1⓪*BPL    posit⓪*NEG    D1⓪*MOVEQ  #'-',D0⓪"!posit  JSR    put⓪*BNE.L  overfl⓪*MOVE   D1,D0⓪*MOVEQ  #'0',D1⓪*DIVU   #1000,D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE.L  overfl⓪*CLR    D0⓪*SWAP   D0⓪*DIVU   #100,D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE    overfl⓪*CLR    D0⓪*SWAP   D0⓪*DIVU   #10,D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE    overfl⓪*SWAP   D0⓪*OR     D1,D0⓪*JSR    put⓪*BNE    overfl⓪"END;⓪"insSpc (lin,line.l,space);⓪"ASSEMBLER⓪*BRA    ende⓪"overfl  TRAP   #6⓪*DC.W   StringOverflow-$4000 ; string overflow⓪"ende    MOVEM.L (A7)+,D3-D6⓪"END⓪ END ConvEng;⓪ ⓪ (*$L+*)⓪ PROCEDURE ConvFix(x:LONGREAL; space,n:CARDINAL; VAR lin: ARRAY OF CHAR);⓪ VAR line:LStr;⓪$e:INTEGER;⓪ BEGIN⓪"ASSEMBLER⓪*MOVEM.L D3-D6,-(A7)⓪*⓪*MOVE.L lin(A6),line.p(A6)⓪*MOVE.W lin+4(A6),line.h(A6)  ; HIGH (lin)⓪*CLR.W  line.l(A6)⓪*⓪*LEA    line(A6),A0⓪*MOVE   x(A6),D2⓪*BNE    notzer⓪*MOVEQ  #'0',D0      ;x = 0.0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.B RadixChar,D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVEQ  #'0',D0⓪*MOVE   n(A6),D1⓪*BEQ    nozero⓪"!zeros  JSR    put⓪*BNE.L  overfl⓪*SUBQ   #1,D1⓪*BNE    zeros⓪"!nozero BRA.L  ende⓪"!notzer BCLR   #0,D2         ;jm 14.6.⓪*BEQ    notneg⓪*MOVE   D2,x(A6)⓪*MOVEQ  #'-',D0⓪*JSR    put⓪*BNE.L  overfl⓪"!notneg JSR    bintodezexp⓪*MOVE   D2,e(A6)⓪*LEA    x(A6),A0      ;x:=x/ten(e)⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*MOVE   D2,(A3)+⓪*SUBQ.L #2,A7⓪*MOVE.L A7,(A3)+    ;'valid'-Para; nur dummy, weil Overflow unmöglich⓪*JSR    ten⓪*ADDQ.L #2,A7⓪*JSR    @RDIV⓪*LEA    x(A6),A2⓪*MOVE.L -(A3),4(A2)⓪*MOVE.L -(A3),(A2)⓪*LEA    e(A6),A1⓪*JSR    norm⓪*MOVE   n(A6),D0      ;Runden: ausgegeben werden n Nachkomma-⓪?; stellen und e Vorkommastellen!⓪?; Auf nomalisierte Mantisse daher hinter⓪?; der (n+e). Stelle 0.5 addieren!⓪*ADD    e(A6),D0⓪*BMI    norund⓪*CMPI   #14,D0⓪*BLS    okrund⓪*MOVEQ  #14,D0⓪"!okrund ASL    #3,D0⓪*LEA    roundkonst,A0  ; dummy, um Weg-Optimierung zu verhindern⓪*LEA    half,A0⓪*ADDA   D0,A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*LEA    x(A6),A0⓪*MOVE.L (A0)+,(A3)+⓪*MOVE.L (A0),(A3)+⓪*JSR    @RADD⓪*LEA    x(A6),A2⓪*MOVE.L -(A3),4(A2)⓪*MOVE.L -(A3),(A2)⓪*LEA    e(A6),A1⓪*JSR    norm⓪"!norund LEA    x(A6),A0       ;trunc(x) in 48-bit Mantisse⓪*MOVE.L (A0)+,D0⓪*MOVE.L (A0),D1⓪*SWAP   D0⓪*MOVE   D0,D2⓪*CLR    D0⓪*SWAP   D0⓪*⓪*ASR    #3,D2⓪*BPL    finis          ;bei Exp >= 0 fertig⓪*NOT    D2             ;Exp -1 ergibt Zählwert 0 in D2 (NEG D2, DEC D2)⓪*; SUBI   #$0FFF,D2⓪*; BGT    finis        ;bei Exp > -1 fertig⓪*; NEG    D2⓪"⓪"!shr    LSR    #1,D0⓪*ROXR.L #1,D1⓪*DBF    D2,shr⓪*BCC    finis          ;evtl. aufrunden⓪*ADDQ.L #1,D1⓪*BCC    finis⓪*ADDQ.W #1,D0⓪"!finis  LEA    line(A6),A0⓪*MOVEQ  #0,D5⓪*TST    e(A6)⓪*BLE    vork0⓪"!vork   JSR    digit⓪*BNE.L  overfl⓪*SUBQ   #1,e(A6)⓪*BGT    vork⓪*BRA    decpt⓪"!vork0  MOVE.L D0,D2⓪*MOVEQ  #'0',D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.L D2,D0⓪"!decpt  MOVE   n(A6),D4⓪*BLE    ende⓪*MOVE.L D0,D2⓪*MOVE.B RadixChar,D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.L D2,D0⓪"!putman TST    e(A6)⓪*BGE    putmdg⓪*ADDQ   #1,e(A6)⓪*MOVE.L D0,D2⓪*MOVEQ  #'0',D0⓪*JSR    put⓪*BNE.L  overfl⓪*MOVE.L D2,D0⓪*SUBQ   #1,D4⓪*BGT    putman⓪*BRA    ende⓪"!putmdg JSR    digit⓪*BNE    overfl⓪*SUBQ   #1,D4⓪"!ende   BGT    putmdg⓪"⓪"END;⓪"insSpc (lin,line.l,space);⓪"ASSEMBLER⓪*BRA    ende0⓪"overfl  TRAP   #6⓪*DC.W   StringOverflow-$4000 ; string overflow⓪"ende0   MOVEM.L (A7)+,D3-D6⓪"END⓪ END ConvFix;⓪((*  <-- 68000 *) *)⓪ ⓪ (*$? M68881 OR A68881:⓪ ⓪ (*$L+*)⓪ ⓪ PROCEDURE CFloat(v:LONGREAL;VAR mpos,epos : BOOLEAN;kfact : INTEGER;⓪1VAR decstr : ARRAY OF CHAR;⓪1VAR exponi : INTEGER);⓪ ⓪ VAR ostr : ARRAY[0..2] OF LONGINT;⓪$lepos: BOOLEAN;⓪ ⓪ BEGIN⓪"ASSEMBLER⓪(; WIRD NICHT BENUTZT!? MOVE.W  kfact(A6),D0         ;Dynamic k-factor⓪"(*$? M68881:⓪(FMOVE.L FPCR,D1⓪(FMOVE.L #0,FPCR               ; keine Exceptions auslösen⓪(FMOVE.D v(A6),FP0⓪(LEA     ostr(A6),A0⓪(FMOVE.P FP0,(A0){17}⓪(FMOVE.L D1,FPCR⓪"*)⓪"(*$? A68881:⓪ !movl1  MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     movl1⓪(SUBQ.B  #2,D0⓪(BEQ     noError⓪(JSR     FPUError⓪ noError⓪(MOVE.W  #$5400,fpcmd         ; FMOVE.D v(A6),FP0⓪ !movl2  MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     movl2⓪(MOVE.L  v(A6),fpop⓪(TST.W   fpstat⓪(MOVE.L  v+4(A6),fpop⓪ !movl22 MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     movl22⓪(LEA     ostr(A6),A0⓪(MOVE.W  #$6C11,fpcmd    ;FMOVE.P FP0,(A0){#17}⓪ !movl3  MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     movl3⓪(MOVE.L  fpop,(A0)+⓪(TST.W   fpstat⓪(MOVE.L  fpop,(A0)+⓪(TST.W   fpstat⓪(MOVE.L  fpop,(A0)⓪(TST.W   fpstat⓪(SUBQ.L  #8,A0⓪"*)⓪(CMPI.B  #$A,3(A0)            ; Coprozessorfehler abfangen (A ~ 10)⓪(BNE     no10pot⓪(MOVE.B  #1,3(A0)⓪ !no10pot⓪(MOVEA.L mpos(A6),A1⓪(CLR.W   (A1)⓪(BTST.B  #7,(A0)⓪(BNE     m_pos⓪(MOVE.W  #1,(A1)⓪(MOVEQ   #1,D2⓪ !m_pos  MOVEA.L epos(A6),A1⓪(CLR.W   (A1)⓪(CLR.W   lepos(A6)⓪(BTST.B  #6,(A0)⓪(BNE     e_pos⓪(MOVE.W  #1,lepos(A6)⓪(MOVE.W  #1,(A1)⓪ !e_pos⓪(ADDA.W  #12,A0               ; (A0) := ostr{12+}⓪(MOVEA.L decstr(A6),A1        ; A1 := ADR(decstr)⓪(MOVEA.L A1,A2⓪(ADDA.W  #17,A2               ; (A2) := decstr{17+}⓪(MOVEQ   #7,D0                ; count := 8⓪(; UNPACK scheint nicht richtig zu laufen (Errata-Sheet nachschauen !)⓪ !unplp  ; UNPK    -(A0),-(A2),#48⓪E; unpack mantissa⓪(CLR.W   D1⓪(MOVE.B  -(A0),D1⓪(LSL.W   #4,D1⓪(LSR.B   #4,D1⓪(ADD.W   #$3030,D1⓪(MOVE.B  D1,-(A2)⓪(LSR.W   #8,D1⓪(MOVE.B  D1,-(A2)⓪ (*      MOVE.W  D1,-(A2)    Durch die beiden Moves ersetzt 19.08. MR *)⓪(DBRA    D0,unplp⓪(MOVE.B  -(A0),D1⓪(ANDI.B  #$0F,D1⓪(ADD.B   #$30,D1⓪(MOVE.B  D1,-(A2)⓪(MOVEA.L A1,A2                ; unpack exponent⓪(ADDA.W  #20,A2⓪(SUBQ.L  #1,A0⓪(CLR.W   D1⓪(MOVE.B  -(A0),D1⓪(CLR.W   D2⓪(MOVE.B  D1,D2⓪(LSR.B   #4,D2⓪(MULU    #10,D2⓪(LSL.W   #4,D1⓪(LSR.B   #4,D1⓪(CLR.W   D0⓪(MOVE.B  D1,D0⓪(ADD.W   D2,D0⓪(ADD.W   #$3030,D1⓪(MOVE.W  D1,-(A2)⓪(MOVE.B  -(A0),D1⓪(ANDI.B  #$F,D1⓪(MOVE.B  D1,D2⓪(MULU    #100,D2⓪(ADD.W   D2,D0⓪(ADD.B   #$30,D1⓪(MOVE.B  D1,-(A2)⓪(TST.W   lepos(A6)⓪(BNE     e2_pos⓪(NEG.W   D0⓪ !e2_pos MOVEA.L exponi(A6),A0⓪(MOVE.W  D0,(A0)⓪"END;⓪ END CFloat;⓪ ⓪ ⓪ (* neue Routinen von GS: *)⓪ ⓪ (*$L-*)⓪ PROCEDURE getExp(r : LONGREAL) : INTEGER;⓪ ⓪"BEGIN⓪$ASSEMBLER⓪ (*$? M68881:⓪(FMOVE.L         FPCR,D0⓪(FMOVE.L         #0,FPCR               ; keine Exceptions auslösen⓪(FABS.D          -(A3),FP0⓪(FLOG10.X        FP0⓪(FMOVE.W         FP0,(A3)+⓪(FMOVE.L         D0,FPCR⓪ *)⓪ (*$? A68881:⓪%l0 MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     l0⓪(SUBQ.B  #2,D0⓪(BEQ     noError⓪(JSR     FPUError⓪%noError:⓪(MOVE.W  #$5418,fpcmd   ; FABS.D <ea>,FP0⓪(MOVE.L  -(A3),D2⓪(MOVE.L  -(A3),D1⓪(MOVE.W  fpstat,D0⓪(SUBQ.B  #8,D0⓪(BNE     Error⓪(MOVE.L  D1,fpop⓪(TST.W   fpstat⓪(MOVE.L  D2,fpop⓪%l5 MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     l5⓪(MOVE.W  #$0015,fpcmd   ; FLOG10.X FP0⓪%l2 MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     l2⓪(SUBQ.B  #2,D0⓪(BNE     Error⓪(MOVE.W  #$7000,fpcmd   ; FMOVE.W FP0,<ea>⓪%l3 MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     l3⓪(SUBQ.B  #2,D0⓪(BNE     Error⓪(MOVE.W  fpop,(A3)+⓪%l4 MOVE.W  fpstat,D0⓪(TST.B   D0⓪(BEQ     l4⓪(SUBQ.B  #2,D0⓪(BNE     Error⓪(RTS⓪%Error⓪(JSR     FPUError⓪(CLR.W   (A3)+⓪ *)⓪$END⓪"END getExp;⓪ (*$L+*)⓪ ⓪ PROCEDURE ConvFloat(    v      : LONGREAL;⓪8spc, n : CARDINAL;⓪4VAR str    : ARRAY OF CHAR);⓪ ⓪"VAR⓪"⓪$len, numLen :       CARDINAL;⓪$numStr      :       ARRAY [0..19] OF CHAR;⓪$epos, mpos  :       BOOLEAN;⓪$expon       :       INTEGER;⓪$kfact,⓪$cptr, i     :       CARDINAL;⓪$over,⓪$fatal       :       BOOLEAN;⓪$⓪"BEGIN⓪$fatal := FALSE;⓪$over := FALSE;⓪$len := HIGH(str) + 1;⓪$IF spc > len THEN⓪&over := TRUE;⓪&spc := len⓪$END;⓪$IF n < 17 THEN⓪&kfact := INTEGER(n) + 1⓪$ELSE⓪&kfact := 17⓪$END;⓪$cFloat(v, mpos, epos, kfact, numStr, expon);⓪$numLen := 7 + n ;                              (* x.E+xxx + <n> *)⓪$IF ~mpos THEN⓪&INC(numLen)⓪$END;⓪$IF spc < numLen THEN⓪&IF numLen > len THEN⓪(over := TRUE;⓪(fatal := TRUE⓪&ELSE⓪(cptr := 0⓪&END⓪$ELSE⓪&cptr := spc - numLen⓪$END;⓪$IF ~fatal THEN⓪&IF cptr > 0 THEN⓪(FOR i := 0 TO cptr - 1 DO⓪*str[i] := ' '⓪(END⓪&END;⓪&IF ~mpos THEN⓪(str[cptr] := '-';⓪(INC(cptr)⓪&END;⓪&str[cptr] := numStr[0];⓪&INC(cptr);⓪&str[cptr] := '.';⓪&INC(cptr);⓪&FOR i := 1 TO n DO⓪(IF i < 17 THEN⓪*str[cptr] := numStr[i]⓪(ELSE⓪*str[cptr] := '0'⓪(END;⓪(INC(cptr)⓪&END;⓪&str[cptr] := 'E';⓪&INC(cptr);⓪&IF epos THEN⓪(str[cptr] := '+'⓪&ELSE⓪(str[cptr] := '-'⓪&END;⓪&INC(cptr);⓪&FOR i := 17 TO 19 DO⓪(str[cptr] := numStr[i];⓪(INC(cptr)⓪&END;⓪&IF cptr < len THEN⓪(str[cptr] := 0C⓪&END⓪$ELSE (* IF ~fatal *)⓪&FOR i := 0 TO len - 1 DO⓪(str[i] := '?'⓪&END⓪$END;⓪$IF over THEN⓪&ASSEMBLER⓪2TRAP            #6⓪2DC.W            -8-$4000⓪&END⓪$END⓪"END ConvFloat;⓪"⓪ ⓪ PROCEDURE ConvEng(    v      : LONGREAL;⓪6spc, n : CARDINAL;⓪2VAR str    : ARRAY OF CHAR);⓪ ⓪"VAR⓪"⓪$len,⓪$numLen,⓪$deccnt      :       CARDINAL;⓪$numStr      :       ARRAY [0..19] OF CHAR;⓪$istr        :       ARRAY [1..3] OF CHAR;⓪$normex,⓪$expon       :       INTEGER;⓪$epos, mpos  :       BOOLEAN;⓪$kfact,⓪$cptr,⓪$i, vork     :       CARDINAL;⓪$over,⓪$fatal       :       BOOLEAN;⓪ ⓪"BEGIN⓪$fatal := FALSE;⓪$over := FALSE;⓪$len := HIGH(str) + 1;⓪$IF spc > len THEN⓪&over := TRUE;⓪&spc := len⓪$END;⓪$IF ABS (v) = 0R THEN⓪&vork:= 1;⓪&normex:= 0⓪$ELSE⓪&expon := getExp(v);⓪&normex := expon;⓪&IF normex < 0 THEN⓪(normex := normex - 2⓪&END;⓪&normex := (normex DIV 3) * 3;⓪&vork := expon - normex + 1;⓪$END;⓪$IF (vork + n) < 17 THEN⓪&kfact := vork + n⓪$ELSE⓪&kfact := 17⓪$END;⓪$cFloat(v, mpos, epos, kfact, numStr, expon);⓪$numLen := 7 + vork + n ;                        (* x..x. + <n> + E+xxxx *)⓪$IF ~mpos THEN⓪&INC(numLen)⓪$END;⓪$IF spc < numLen THEN⓪&IF numLen > len THEN⓪(over := TRUE;⓪(fatal := TRUE⓪&ELSE⓪(cptr := 0⓪&END⓪$ELSE⓪&cptr := spc - numLen⓪$END;⓪$IF ~fatal THEN⓪&IF cptr > 0 THEN⓪(FOR i := 0 TO cptr - 1 DO⓪*str[i] := ' '⓪(END⓪&END;⓪&IF ~mpos THEN⓪(str[cptr] := '-';⓪(INC(cptr)⓪&END;⓪&deccnt := 0;⓪&FOR i := vork TO 1 BY -1 DO⓪(str[cptr] := numStr[deccnt];⓪(INC(cptr);⓪(INC(deccnt)⓪&END;⓪&str[cptr] := '.';⓪&INC(cptr);⓪&FOR i := 1 TO n DO⓪(IF deccnt < 17 THEN⓪*str[cptr] := numStr[deccnt]⓪(ELSE⓪*str[cptr] := '0'⓪(END;⓪(INC(cptr);⓪(INC(deccnt)⓪&END;⓪&str[cptr] := 'E';⓪&INC(cptr);⓪&IF normex < 0 THEN⓪(str[cptr] := '-';⓪(normex := -normex⓪&ELSE⓪(str[cptr] := '+'⓪&END;⓪&INC(cptr);⓪&str[cptr] := '0';⓪&INC(cptr);⓪&ConvInt(normex, 3, istr);⓪&FOR i := 1 TO 3 DO⓪(IF istr[i] = ' ' THEN⓪*str[cptr] := '0'⓪(ELSE⓪*str[cptr] := istr[i]⓪(END;⓪(INC(cptr)⓪&END;⓪&IF cptr < len THEN⓪(str[cptr] := 0C⓪&END⓪$ELSE (* IF ~fatal *)⓪&FOR i := 0 TO len - 1 DO⓪(str[i] := '?'⓪&END⓪$END;⓪$IF over THEN⓪&ASSEMBLER⓪2TRAP            #6⓪2DC.W            -8-$4000⓪&END⓪$END⓪"END ConvEng;⓪"⓪ ⓪ PROCEDURE ConvFix(    v      : LONGREAL;⓪6spc, n : CARDINAL;⓪2VAR str    : ARRAY OF CHAR);⓪ ⓪"VAR⓪"⓪$len,⓪$numLen      :       CARDINAL;⓪$numStr      :       ARRAY [0..19] OF CHAR;⓪$kfact,⓪$deccnt,⓪$expon       :       INTEGER;⓪$epos, mpos  :       BOOLEAN;⓪$cptr,⓪$i, vork     :       CARDINAL;⓪$over,⓪$fatal       :       BOOLEAN;⓪ ⓪"BEGIN⓪$fatal := FALSE;⓪$over := FALSE;⓪$len := HIGH(str) + 1;⓪$IF spc > len THEN⓪&over := TRUE;⓪&spc := len⓪$END;⓪$IF ABS (v) = 0R THEN⓪&kfact := n + 1;⓪$ELSE⓪&expon := getExp(v);⓪&kfact := expon + INTEGER(n) + 1;⓪$END;⓪$IF kfact > 17 THEN⓪&kfact := 17⓪$END;⓪$IF kfact > 0 THEN⓪&cFloat(v, mpos, epos, kfact, numStr, expon)⓪$END;⓪$IF expon < 0 THEN⓪&vork := 1⓪$ELSE⓪&vork := 1 + expon⓪$END;⓪$numLen := 1 + vork + n ;                               (* x..x. + <n> *)⓪$IF ~mpos THEN⓪&INC(numLen)⓪$END;⓪$IF spc < numLen THEN⓪&IF numLen > len THEN⓪(over := TRUE;⓪(fatal := TRUE⓪&ELSE⓪(cptr := 0⓪&END⓪$ELSE⓪&cptr := spc - numLen⓪$END;⓪$IF ~fatal THEN⓪&IF cptr > 0 THEN⓪(FOR i := 0 TO cptr-1 DO⓪*str[i] := ' '⓪(END⓪&END;⓪&IF ~mpos THEN⓪(str[cptr] := '-';⓪(INC(cptr)⓪&END;⓪&IF expon < 0 THEN⓪(deccnt := expon⓪&ELSE⓪(deccnt := 0⓪&END;⓪&FOR i := vork TO 1 BY -1 DO⓪(IF ~(deccnt < 0) AND (deccnt < 17) THEN⓪*str[cptr] := numStr[deccnt]⓪(ELSE⓪*str[cptr] := '0'⓪(END;⓪(INC(cptr);⓪(INC(deccnt)⓪&END;⓪&str[cptr] := '.';⓪&INC(cptr);⓪&FOR i := 1 TO n DO⓪(IF ~(deccnt < 0) AND (deccnt < 17) THEN⓪*str[cptr] := numStr[deccnt]⓪(ELSE⓪*str[cptr] := '0'⓪(END;⓪(INC(cptr);⓪(INC(deccnt)⓪&END;⓪&IF cptr < len THEN⓪(str[cptr] := 0C⓪&END⓪$ELSE (* IF ~fatal *)⓪&FOR i := 0 TO len - 1 DO⓪(str[i] := '?'⓪&END⓪$END;⓪$IF over THEN⓪&ASSEMBLER⓪2TRAP            #6⓪2DC.W            -8-$4000⓪&END⓪$END⓪"END ConvFix;⓪ ⓪ (* noch eingeklammert, könnte aber mal übernommen werden!⓪ ⓪((****************************************************************************)⓪((*                                                                          *)⓪((*                      C O N V E R T    -   6 8 0 2 0                      *)⓪((*                                                                          *)⓪((* Errorchecks eingebaut, mehere kleine Fehler beseitigt, zum Teil          *)⓪((* neu programmiert.                                                  (GS)  *)⓪((*                                                                          *)⓪((****************************************************************************)⓪(⓪0⓪((*$L-*)⓪(PROCEDURE getExp(r : REAL) : INTEGER;⓪9⓪*BEGIN⓪,ASSEMBLER⓪8FABS.D          -(A3),FP0      ; kein Runtime-Error möglich⓪8FLOG10.X        FP0⓪8FMOVE.W         FP0,(A3)+⓪,END⓪*END getExp;⓪((*$L+*)⓪9⓪9⓪(PROCEDURE cFloat(    r          : REAL;             (* stark geändert GS *)⓪9VAR mpos, epos : BOOLEAN;⓪=kfaktor    : CARDINAL;⓪9VAR decstr     : ARRAY OF CHAR;⓪9VAR exponent   : INTEGER       );⓪(⓪*(* decstr hat folgenden Aufbau :                                          *)⓪*(*   Der String ist 20 Zeichen lang, linksbündig die Mantisse mit kfaktor *)⓪*(*   signifikanten Stellen, rechtsbündig der dreistellige Exponent        *)⓪*⓪*VAR⓪*⓪,BCDst       : ARRAY[0..2] OF LONGINT;⓪(⓪*BEGIN⓪,ASSEMBLER⓪8MOVE            kfaktor(A6),D0⓪8FMOVE.D         r(A6),FP0⓪8LEA             BCDst(A6),A0⓪8FMOVE.P         FP0,(A0){D0}⓪8MOVEA.L         mpos(A6),A2⓪8CLR             (A2)⓪8BTST.B          #7,(A0)       ; sign of mantissa⓪8BNE             m_neg⓪8MOVE            #1,(A2)⓪.⓪.!m_neg    MOVEA.L         epos(A6),A2⓪8CLR             (A2)⓪8BTST.B          #6,(A0)       ; sign of exponent⓪8BNE             e_neg⓪8MOVE            #1,(A2)⓪.⓪.!e_neg    MOVEA.L         decstr(A6),A1⓪8ADDA.W          D0,A1         ; A1 after last digit⓪8ADDQ            #4,A0      ; A0 points after first mantissa dig.⓪8MOVE            D0,D1⓪8LSR             #1,D1⓪8ADDA.W          D1,A0      ; A0 points after last mantissa digit⓪8SUBQ            #1,D0⓪8BTST            #0,D0⓪8BEQ             cont1⓪8⓪8MOVE.B          -(A0),D1⓪8LSR             #4,D1⓪8ADD.B           #'0',D1⓪8MOVE.B          D1,-(A1)⓪8⓪.!cont1    MOVE            D0,D1⓪8LSR             #1,D1⓪8BRA             entry⓪8⓪.!unploop  UNPK            -(A0),-(A1),#$3030⓪.!entry    DBRA            D1,unploop⓪8⓪8MOVE.B          -(A0),D1⓪8ANDI            #$0F,D1⓪8ADD.B           #'0',D1⓪8MOVE.B          D1,-(A1)⓪8⓪.!done     MOVEA.L         decstr(A6),A1⓪8LEA             20(A1),A1⓪8LEA             BCDst(A6),A0⓪8ADDQ            #2,A0⓪8UNPK            -(A0),-(A1),#$3030⓪8⓪8MOVE.B          -(A0),D1⓪8ANDI            #$0F,D1⓪8ADD.B           #'0',D1⓪8MOVE.B          D1,-(A1)⓪-⓪8MOVEA.L         decstr(A6),A1⓪8LEA             17(A1),A1⓪8⓪8MOVEQ           #0,D0⓪8MOVEQ           #0,D1⓪8MOVEQ           #2,D2⓪8⓪0!Loop   MOVE.B          (A1)+,D0⓪8SUB.B           #'0',D0⓪8MULU            #10,D1⓪8ADD             D0,D1⓪8DBRA            D2,Loop⓪8⓪8TST             (A2)⓪8BNE             e_pos2⓪8NEG             D1⓪/!e_pos2  MOVEA.L         exponent(A6),A0⓪8MOVE            D1,(A0)⓪-END;⓪+END cFloat;⓪0⓪*⓪(PROCEDURE ConvToReal(    get   : GetProc;⓪=VAR info  : GetInfo;⓪=VAR valid : BOOLEAN ) : REAL;⓪(⓪*VAR⓪*⓪,mneg, eneg,⓪,isdigit     :       BOOLEAN;⓪,i           :       CARDINAL;⓪,exp         :       INTEGER;⓪,c           :       CHAR;⓪,x           :       REAL;⓪,⓪,⓪*BEGIN⓪,ASSEMBLER⓪8MOVE.L          D3,-(A7)⓪8BRA             start⓪8⓪.!getchr   MOVE.L          A0,-(A7)⓪8MOVE.L          info(A6),(A3)+⓪8MOVE.L          get(A6),A0⓪8JSR             (A0)⓪8MOVE.L          (A7)+,A0⓪8MOVE.L          info(A6),A1⓪8MOVEQ           #0,D0⓪8MOVE.B          GetInfo.ch(A1),D0⓪8MOVE.B          D0,c(A6)⓪8SUBI.B          #'0',D0⓪8CMPI.B          #9,D0⓪8SLS             D2⓪8MOVE.B          D2,isdigit(A6)⓪8RTS⓪8⓪.!mulx10                                         (* x in FP0 *)⓪8FMUL.W          #10,FP0⓪8MOVEQ           #0,D0⓪8MOVE.B          c(A6),D0⓪8SUBI.B          #'0',D0⓪8FADD.W          D0,FP0⓪8RTS⓪8⓪.!start    MOVE.L          valid(A6),A1⓪8CLR             (A1)⓪.!skipspc  BSR             getchr⓪8CMPI.B          #' ',c(A6)⓪8BEQ             skipspc⓪8CMPI.B          #9,c(A6)                 ; TAB⓪8BEQ             skipspc⓪8⓪8CMPI.B          #'-',c(A6)⓪8SEQ             mneg(A6)⓪8BNE             numneg⓪8BSR             getchr⓪.!numneg   CMPI.B          #'+',c(A6)⓪8BNE             numpos⓪8BSR             getchr⓪.⓪.!numpos   FMOVE.W         #0,FP0⓪8⓪8CLR             exp(A6)⓪.!mant1    TST.B           isdigit(A6)⓪8BEQ             point⓪8MOVE.L          valid(A6),A1⓪8MOVE            #1,(A1)⓪8BSR             mulx10⓪8BSR             getchr⓪8BRA             mant1⓪.!point    MOVE.B          c(A6),D0⓪8CMP.B           RadixChar,D0⓪8BNE             expon⓪8BSR             getchr⓪.!mant2    TST.B           isdigit(A6)⓪8BEQ             expon⓪8MOVE.L          valid(A6),A1⓪8MOVE            #1,(A1)⓪8BSR             mulx10⓪8SUBQ            #1,exp(A6)⓪.!dont1    BSR             getchr⓪8BRA             mant2⓪.!expon    CMPI.B          #'E',c(A6)⓪8BEQ             expon0⓪8CMPI.B          #'e',c(A6)⓪8BNE             return⓪.!expon0   BSR             getchr⓪8CLR             eneg(A6)⓪8CMPI.B          #'-',c(A6)⓪8SEQ             eneg(A6)⓪8BNE             noeneg⓪8BSR             getchr⓪.!noeneg   CMPI.B          #'+',c(A6)⓪8BNE             noepos⓪8BSR             getchr⓪.!noepos   CLR             D3⓪.!expon1   TST.B           isdigit(A6)⓪8BEQ             expon2⓪8MULU            #10,D3⓪8MOVE.B          c(A6),D1⓪8ANDI            #$F,D1⓪8ADD             D1,D3⓪8BSR             getchr⓪8BRA             expon1⓪.⓪.!expon2   TST.B           eneg(A6)⓪8BEQ             expon3⓪8NEG             D3⓪.!expon3   ADD             exp(A6),D3⓪8MOVE            D3,D0⓪8BPL             testex⓪8NEG             D0⓪.!testex   CMPI            #307,D0⓪8BLE             expon4⓪8MOVE.L          valid(A6),A1⓪8CLR             (A1)⓪8⓪.!expon4   MOVE            D3,exp(A6)⓪.!return   TST.B           mneg(A6)⓪8BEQ             return1⓪8FTST.X          FP0⓪8FBEQ            return1⓪8FNEG.X          FP0⓪.!return1  MOVE.L          (A7)+,D3⓪8FTENTOX.W       exp(A6),FP1⓪8FMUL.X          FP1,FP0⓪8FMOVE.D         FP0,x(A6)⓪8FMOVE.L         FPSR,D0⓪8AND.B           #$40,D0⓪8BEQ             ok⓪8MOVE.L          valid(A6),A1⓪8CLR             (A1)⓪8FMOVE.L         #$00,FPSR⓪.!ok                           ; ubu 31.5.88⓪L; GS 7.9.88⓪,END;⓪,RETURN x⓪*END ConvToReal;⓪(⓪(⓪(PROCEDURE ConvFloat(    v      : REAL;⓪@spc, n : CARDINAL;⓪<VAR str    : ARRAY OF CHAR);⓪(⓪*VAR⓪*⓪,len, numLen :       CARDINAL;⓪,numStr      :       ARRAY [0..19] OF CHAR;⓪,epos, mpos  :       BOOLEAN;⓪,expon       :       INTEGER;⓪,kfact,⓪,cptr, i     :       CARDINAL;⓪,over,⓪,fatal       :       BOOLEAN;⓪,⓪*BEGIN⓪,fatal := FALSE;⓪,over := FALSE;⓪,len := HIGH(str) + 1;⓪,IF spc > len THEN⓪.over := TRUE;⓪.spc := len⓪,END;⓪,IF n < 17 THEN⓪.kfact := INTEGER(n) + 1⓪,ELSE⓪.kfact := 17⓪,END;⓪,cFloat(v, mpos, epos, kfact, numStr, expon);⓪,numLen := 7 + n ;                              (* x.E+xxx + <n> *)⓪,IF ~mpos THEN⓪.INC(numLen)⓪,END;⓪,IF spc < numLen THEN⓪.IF numLen > len THEN⓪0over := TRUE;⓪0fatal := TRUE⓪.ELSE⓪0cptr := 0⓪.END⓪,ELSE⓪.cptr := spc - numLen⓪,END;⓪,IF ~fatal THEN⓪.IF cptr > 0 THEN⓪0FOR i := 0 TO cptr - 1 DO⓪2str[i] := ' '⓪0END⓪.END;⓪.IF ~mpos THEN⓪0str[cptr] := '-';⓪0INC(cptr)⓪.END;⓪.str[cptr] := numStr[0];⓪.INC(cptr);⓪.str[cptr] := '.';⓪.INC(cptr);⓪.FOR i := 1 TO n DO⓪0IF i < 17 THEN⓪2str[cptr] := numStr[i]⓪0ELSE⓪2str[cptr] := '0'⓪0END;⓪0INC(cptr)⓪.END;⓪.str[cptr] := 'E';⓪.INC(cptr);⓪.IF epos THEN⓪0str[cptr] := '+'⓪.ELSE⓪0str[cptr] := '-'⓪.END;⓪.INC(cptr);⓪.FOR i := 17 TO 19 DO⓪0str[cptr] := numStr[i];⓪0INC(cptr)⓪.END;⓪.IF cptr < len THEN⓪0str[cptr] := 0C⓪.END⓪,ELSE (* IF ~fatal *)⓪.FOR i := 0 TO len - 1 DO⓪0str[i] := '?'⓪.END⓪,END;⓪,IF over THEN⓪.ASSEMBLER⓪:TRAP            #6⓪:DC.W            -8-$4000⓪.END⓪,END⓪*END ConvFloat;⓪*⓪(⓪(PROCEDURE ConvEng(    v      : REAL;⓪>spc, n : CARDINAL;⓪:VAR str    : ARRAY OF CHAR);⓪(⓪*VAR⓪*⓪,len,⓪,numLen,⓪,deccnt      :       CARDINAL;⓪,numStr      :       ARRAY [0..19] OF CHAR;⓪,istr        :       ARRAY [1..3] OF CHAR;⓪,normex,⓪,expon       :       INTEGER;⓪,epos, mpos  :       BOOLEAN;⓪,kfact,⓪,cptr,⓪,i, vork     :       CARDINAL;⓪,over,⓪,fatal       :       BOOLEAN;⓪(⓪*BEGIN⓪,fatal := FALSE;⓪,over := FALSE;⓪,len := HIGH(str) + 1;⓪,IF spc > len THEN⓪.over := TRUE;⓪.spc := len⓪,END;⓪,expon := getExp(v);⓪,normex := expon;⓪,IF normex < 0 THEN⓪.normex := normex - 2⓪,END;⓪,normex := (normex DIV 3) * 3;⓪,vork := expon - normex + 1;⓪,IF (vork + n) < 17 THEN⓪.kfact := vork + n⓪,ELSE⓪.kfact := 17⓪,END;⓪,cFloat(v, mpos, epos, kfact, numStr, expon);⓪,numLen := 7 + vork + n ;                        (* x..x. + <n> + E+xxxx *)⓪,IF ~mpos THEN⓪.INC(numLen)⓪,END;⓪,IF spc < numLen THEN⓪.IF numLen > len THEN⓪0over := TRUE;⓪0fatal := TRUE⓪.ELSE⓪0cptr := 0⓪.END⓪,ELSE⓪.cptr := spc - numLen⓪,END;⓪,IF ~fatal THEN⓪.IF cptr > 0 THEN⓪0FOR i := 0 TO cptr - 1 DO⓪2str[i] := ' '⓪0END⓪.END;⓪.IF ~mpos THEN⓪0str[cptr] := '-';⓪0INC(cptr)⓪.END;⓪.deccnt := 0;⓪.FOR i := vork TO 1 BY -1 DO⓪0str[cptr] := numStr[deccnt];⓪0INC(cptr);⓪0INC(deccnt)⓪.END;⓪.str[cptr] := '.';⓪.INC(cptr);⓪.FOR i := 1 TO n DO⓪0IF deccnt < 17 THEN⓪2str[cptr] := numStr[deccnt]⓪0ELSE⓪2str[cptr] := '0'⓪0END;⓪0INC(cptr);⓪0INC(deccnt)⓪.END;⓪.str[cptr] := 'E';⓪.INC(cptr);⓪.IF normex < 0 THEN⓪0str[cptr] := '-';⓪0normex := -normex⓪.ELSE⓪0str[cptr] := '+'⓪.END;⓪.INC(cptr);⓪.str[cptr] := '0';⓪.INC(cptr);⓪.ConvInt(normex, 3, istr);⓪.FOR i := 1 TO 3 DO⓪0IF istr[i] = ' ' THEN⓪2str[cptr] := '0'⓪0ELSE⓪2str[cptr] := istr[i]⓪0END;⓪0INC(cptr)⓪.END;⓪.IF cptr < len THEN⓪0str[cptr] := 0C⓪.END⓪,ELSE (* IF ~fatal *)⓪.FOR i := 0 TO len - 1 DO⓪0str[i] := '?'⓪.END⓪,END;⓪,IF over THEN⓪.ASSEMBLER⓪:TRAP            #6⓪:DC.W            -8-$4000⓪.END⓪,END⓪*END ConvEng;⓪*⓪(⓪(PROCEDURE ConvFix(    v      : REAL;⓪>spc, n : CARDINAL;⓪:VAR str    : ARRAY OF CHAR);⓪(⓪*VAR⓪*⓪,len,⓪,numLen      :       CARDINAL;⓪,numStr      :       ARRAY [0..19] OF CHAR;⓪,kfact,⓪,deccnt,⓪,expon       :       INTEGER;⓪,epos, mpos  :       BOOLEAN;⓪,cptr,⓪,i, vork     :       CARDINAL;⓪,over,⓪,fatal       :       BOOLEAN;⓪(⓪*BEGIN⓪,fatal := FALSE;⓪,over := FALSE;⓪,len := HIGH(str) + 1;⓪,IF spc > len THEN⓪.over := TRUE;⓪.spc := len⓪,END;⓪,expon := getExp(v);⓪,kfact := expon + INTEGER(n) + 1;⓪,IF kfact > 17 THEN⓪.kfact := 17⓪,END;⓪,IF kfact > 0 THEN⓪.cFloat(v, mpos, epos, kfact, numStr, expon)⓪,END;⓪,IF expon < 0 THEN⓪.vork := 1⓪,ELSE⓪.vork := 1 + expon⓪,END;⓪,numLen := 1 + vork + n ;                               (* x..x. + <n> *)⓪,IF ~mpos THEN⓪.INC(numLen)⓪,END;⓪,IF spc < numLen THEN⓪.IF numLen > len THEN⓪0over := TRUE;⓪0fatal := TRUE⓪.ELSE⓪0cptr := 0⓪.END⓪,ELSE⓪.cptr := spc - numLen⓪,END;⓪,IF ~fatal THEN⓪.IF cptr > 0 THEN⓪0FOR i := 0 TO cptr-1 DO⓪2str[i] := ' '⓪0END⓪.END;⓪.IF ~mpos THEN⓪0str[cptr] := '-';⓪0INC(cptr)⓪.END;⓪.IF expon < 0 THEN⓪0deccnt := expon⓪.ELSE⓪0deccnt := 0⓪.END;⓪.FOR i := vork TO 1 BY -1 DO⓪0IF ~(deccnt < 0) AND (deccnt < 17) THEN⓪2str[cptr] := numStr[deccnt]⓪0ELSE⓪2str[cptr] := '0'⓪0END;⓪0INC(cptr);⓪0INC(deccnt)⓪.END;⓪.str[cptr] := '.';⓪.INC(cptr);⓪.FOR i := 1 TO n DO⓪0IF ~(deccnt < 0) AND (deccnt < 17) THEN⓪2str[cptr] := numStr[deccnt]⓪0ELSE⓪2str[cptr] := '0'⓪0END;⓪0INC(cptr);⓪0INC(deccnt)⓪.END;⓪.IF cptr < len THEN⓪0str[cptr] := 0C⓪.END⓪,ELSE (* IF ~fatal *)⓪.FOR i := 0 TO len - 1 DO⓪0str[i] := '?'⓪.END⓪,END;⓪,IF over THEN⓪.ASSEMBLER⓪:TRAP            #6⓪:DC.W            -8-$4000⓪.END⓪,END⓪*END ConvFix;⓪0⓪0⓪ (*****************************************************************************)⓪ (*                                                                           *)⓪ (*                                   E N D E (von GS)                        *)⓪ (*                                                                           *)⓪ (*****************************************************************************)⓪ *)⓪ ⓪ (*  <-- 68020 *) *)⓪ ⓪ (*$L-*)⓪ PROCEDURE ConvReal(x:LONGREAL; space,n:CARDINAL; VAR str: ARRAY OF CHAR);⓪ BEGIN⓪"(* Die folgende Würgerei hat den Zweck, daß das Scanning bei einem⓪#* 'string overflow'-Fehler den Aufrufer dieser Funktion erreicht.  *)⓪"ASSEMBLER⓪(MOVE.L  A6,-(A7)⓪ (*$? CompilerVersion > 3:⓪(LEA     (A3),A6⓪ *)⓪ (*$? CompilerVersion <= 3:⓪(LEA     -18(A3),A6⓪ *)⓪"END;⓪"IF (ABS(x)=0R) OR (FixToFloatMin<=ABS(X)) & (ABS(X)<=FixToFloatMax) THEN⓪$ASSEMBLER⓪(MOVE.L  (A7)+,A6⓪(JMP     ConvFix⓪$END⓪"ELSE⓪$ASSEMBLER⓪(MOVE.L  (A7)+,A6⓪(JMP     ConvFloat⓪$END⓪"END⓪ END ConvReal;⓪ ⓪ END Convert.⓪ ə
  2. (* $00003F7D$0000A3BE$00007F84$00008C8B$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$000096D2$FFF317C4$0000EB26$FFF317C4$00009F3E$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4$FFF317C4Ç$000009A5T.......T.......T.......T.......T.......T.......T.......T.......T.......T.......$0000A0EA$0000A150$000009BB$00000991$00009662$000096E2$00000984$000009B8$000009AB$000096DF$000009A5$0000963E$000096BF$00009EE9$0000A014$0000A06D¼Çâ*)
  3.